<template>
  <div class="app-container">
    <!-- 导入方式选择 -->
    <el-card class="box-card" style="margin-bottom: 20px;">
      <div slot="header" class="clearfix">
        <span style="font-weight: bold;">选择导入方式</span>
      </div>
      <el-radio-group v-model="queryForm.importType" @change="handleImportTypeChange" size="medium">
        <el-radio-button label="dateRange">时间段导入</el-radio-button>
        <el-radio-button label="billsID">单据号导入</el-radio-button>
      </el-radio-group>
    </el-card>

    <!-- 导入参数配置 -->
    <el-card class="box-card">
      <div slot="header" class="clearfix">
        <span style="font-weight: bold;">
          {{ queryForm.importType === 'billsID' ? '单据号导入配置' : '时间段导入配置' }}
        </span>
      </div>

      <el-form :model="queryForm" ref="queryForm" :rules="formRules" label-width="120px" size="medium">
        <!-- 单据号导入表单 -->
        <template v-if="queryForm.importType === 'billsID'">
          <el-form-item label="单据号" prop="billsID">
            <el-input
              v-model="queryForm.billsID"
              placeholder="请输入要导入的单据号"
              clearable
              style="width: 400px;"
            />
          </el-form-item>
          <el-form-item>
            <el-alert
              title="单据号导入说明"
              description="输入单据号后，系统将调用SOAP接口QueryBillsDetail获取该单据的详细信息并保存到本地数据库。"
              type="info"
              :closable="false"
              show-icon>
            </el-alert>
          </el-form-item>
        </template>

        <!-- 时间段导入表单 -->
        <template v-if="queryForm.importType === 'dateRange'">
          <el-form-item label="开始时间" prop="startDate">
            <el-date-picker
              v-model="queryForm.startDate"
              type="date"
              placeholder="选择开始时间"
              format="yyyy-MM-dd"
              value-format="yyyy-MM-dd"
              style="width: 200px;"
              :picker-options="datePickerOptions"
              @change="validateDateRange"
            />
          </el-form-item>

          <el-form-item label="结束时间" prop="endDate">
            <el-date-picker
              v-model="queryForm.endDate"
              type="date"
              placeholder="选择结束时间"
              format="yyyy-MM-dd"
              value-format="yyyy-MM-dd"
              style="width: 200px;"
              :picker-options="datePickerOptions"
              @change="validateDateRange"
            />
          </el-form-item>

          <el-form-item label="单据类型" prop="billsType">
            <el-select
              v-model="queryForm.billsType"
              placeholder="请选择单据类型"
              style="width: 200px;"
            >
              <el-option label="全部" value="A"></el-option>
              <el-option label="入库" value="AI"></el-option>
              <el-option label="出库" value="AO"></el-option>
            </el-select>
          </el-form-item>

          <el-form-item label="往来单位" prop="institutionName">
            <div style="display: flex; align-items: center;">
              <el-select
                v-model="queryForm.institutionName"
                placeholder="请选择往来单位（可选）"
                filterable
                clearable
                style="width: 400px; margin-right: 10px;"
                :loading="institutionLoading"
                @change="handleInstitutionChange"
              >
                <el-option
                  v-for="item in filteredInstitutions"
                  :key="item.value"
                  :label="item.label"
                  :value="item.value">
                </el-option>
              </el-select>
              <el-button
                type="primary"
                size="small"
                icon="el-icon-refresh"
                :loading="updateCustomerLoading"
                @click="handleUpdateCustomer"
                v-hasPermi="['wareHouse:billsImport:query']"
              >
                {{ updateCustomerLoading ? '更新中...' : '更新往来单位' }}
              </el-button>
            </div>
          </el-form-item>

          <el-form-item v-if="dateRangeError">
            <el-alert
              :title="dateRangeError"
              type="error"
              :closable="false"
              show-icon>
            </el-alert>
          </el-form-item>

          <el-form-item v-if="!dateRangeError && queryForm.startDate && queryForm.endDate">
            <el-alert
              :title="getDateRangeInfo()"
              type="success"
              :closable="false"
              show-icon>
            </el-alert>
          </el-form-item>

          <el-form-item>
            <el-alert
              title="时间段导入说明"
              :description="getTimeRangeDescription()"
              type="info"
              :closable="false"
              show-icon>
            </el-alert>
          </el-form-item>
        </template>

        <!-- 操作按钮 -->
        <el-form-item>
          <el-button
            type="primary"
            icon="el-icon-upload2"
            @click="handleImport"
            :loading="loading"
            v-hasPermi="getImportPermission()"
            size="medium"
          >
            {{ loading ? '导入中...' : '开始导入' }}
          </el-button>
          <el-button
            icon="el-icon-refresh"
            @click="resetQuery"
            size="medium"
          >
            重置
          </el-button>
        </el-form-item>
      </el-form>
    </el-card>

    <!-- 单据选择对话框 -->
    <el-dialog
      title="选择要导入的单据"
      :visible.sync="showBillsDialog"
      width="80%"
      :before-close="handleCloseBillsDialog"
    >
      <el-table
        ref="billsTable"
        :data="billsList"
        v-loading="billsLoading"
        @selection-change="handleBillsSelectionChange"
        style="width: 100%"
        max-height="400"
      >
        <el-table-column type="selection" width="55" align="center" />
        <el-table-column prop="billCode" label="单据号" width="180" />
        <el-table-column prop="billTypeName" label="单据类型" width="120" />
        <el-table-column prop="billTime" label="单据时间" width="160" />
        <el-table-column prop="fromUserName" label="发货方" min-width="150" show-overflow-tooltip />
        <el-table-column prop="toUserName" label="收货方" min-width="150" show-overflow-tooltip />
        <el-table-column prop="processDate" label="处理时间" width="160" />

        <!-- 空状态提示 -->
        <template slot="empty">
          <div style="padding: 40px 0; text-align: center; color: #909399;">
            <i class="el-icon-document" style="font-size: 48px; margin-bottom: 16px; display: block;"></i>
            <div style="font-size: 14px; margin-bottom: 8px;">暂无单据数据</div>
            <div style="font-size: 12px; color: #C0C4CC;">
              请检查时间范围和往来单位设置
            </div>
          </div>
        </template>
      </el-table>

      <div slot="footer" class="dialog-footer">
        <span style="float: left; line-height: 32px; color: #606266;">
          已选择 {{ selectedBills.length }} 条单据
        </span>
        <el-button @click="handleCloseBillsDialog">取 消</el-button>
        <el-button
          type="primary"
          @click="handleImportSelectedBills"
          :loading="importingBills"
          :disabled="selectedBills.length === 0"
        >
          {{ importingBills ? '导入中...' : '确认导入' }}
        </el-button>
      </div>
    </el-dialog>
  </div>
</template>

<script>
import { importByBillsID, importByDateRange, getInstitutions, updateCustomerInfo, importSelectedBills } from "@/api/wareHouse/billsImport";

export default {
  name: "BillsImport",
  data() {
    return {
      // 加载状态
      loading: false,
      // 更新往来单位加载状态
      updateCustomerLoading: false,
      // 往来单位加载状态
      institutionLoading: false,
      // 往来单位选项（所有数据）
      institutionOptions: [],
      // 日期范围错误信息
      dateRangeError: '',
      // 查询表单
      queryForm: {
        importType: 'dateRange', // 默认时间段导入
        billsID: '',
        institutionName: '',
        startDate: '',
        endDate: '',
        billsType: 'AO' // 默认出库
      },
      // 表单验证规则
      formRules: {
        billsID: [
          { required: true, message: '单据号不能为空', trigger: 'blur' }
        ],
        startDate: [
          { required: true, message: '开始时间不能为空', trigger: 'change' }
        ],
        endDate: [
          { required: true, message: '结束时间不能为空', trigger: 'change' }
        ]
      },
      // 日期选择器配置
      datePickerOptions: {
        disabledDate(time) {
          // 禁用当前日期之后的日期
          return time.getTime() > Date.now();
        }
      },
      // 单据列表相关
      billsList: [],
      selectedBills: [],
      showBillsDialog: false,
      billsLoading: false,
      importingBills: false
    };
  },
  computed: {
    // 过滤后的往来单位列表（前端过滤）
    filteredInstitutions() {
      return this.institutionOptions;
    }
  },
  methods: {
    /** 导入方式改变 */
    handleImportTypeChange() {
      // 只重置表单字段，不重置往来单位数据
      this.queryForm.billsID = '';
      this.queryForm.institutionName = '';
      this.queryForm.startDate = '';
      this.queryForm.endDate = '';
      this.dateRangeError = '';
      this.$refs.queryForm && this.$refs.queryForm.clearValidate();
    },

    /** 往来单位改变 */
    handleInstitutionChange() {
      this.validateDateRange();
    },

    /** 加载所有往来单位数据 */
    loadInstitutions() {
      if (this.institutionLoading) {
        return; // 防止重复加载
      }

      this.institutionLoading = true;
      getInstitutions().then(response => {
        this.institutionLoading = false;
        if (response.code === 200) {
          this.institutionOptions = response.data || [];
          if (this.institutionOptions.length === 0) {
            console.warn('往来单位列表为空，可能需要先更新往来单位数据');
          }
        } else {
          this.institutionOptions = [];
          console.error('加载往来单位失败:', response.msg);
        }
      }).catch(error => {
        this.institutionLoading = false;
        this.institutionOptions = [];
        console.error('加载往来单位异常:', error);
        // 静默失败，不显示错误提示，避免影响用户体验
      });
    },

    /** 更新往来单位信息 */
    handleUpdateCustomer() {
      this.$modal.confirm('确认要更新往来单位信息吗？此操作将从外部系统同步最新的往来单位数据。').then(() => {
        this.updateCustomerLoading = true;

        updateCustomerInfo().then(response => {
          this.updateCustomerLoading = false;

          if (response.code === 200) {
            this.$modal.msgSuccess(response.msg || "往来单位信息更新成功");
            // 更新成功后重新加载往来单位
            this.loadInstitutions();
          } else {
            this.$modal.msgError(response.msg || "更新失败");
          }
        }).catch(error => {
          this.updateCustomerLoading = false;

          // 网络错误或其他异常的友好提示
          let errorMessage = "更新往来单位遇到问题，请稍后重试";

          if (error.response) {
            if (error.response.status === 500) {
              errorMessage = "服务器内部错误，请联系管理员";
            } else if (error.response.status === 404) {
              errorMessage = "请求的接口不存在，请联系管理员";
            } else if (error.response.status === 403) {
              errorMessage = "没有权限执行此操作";
            } else {
              errorMessage = `请求失败 (${error.response.status})，请重试`;
            }
          } else if (error.request) {
            errorMessage = "网络连接失败，请检查网络后重试";
          } else {
            errorMessage = error.message || "未知错误，请重试";
          }

          this.$modal.msgError(errorMessage);
        });
      }).catch(() => {
        // 用户取消操作
      });
    },

    /** 验证日期范围 */
    validateDateRange() {
      this.dateRangeError = '';

      if (this.queryForm.startDate && this.queryForm.endDate) {
        const start = new Date(this.queryForm.startDate);
        const end = new Date(this.queryForm.endDate);
        const today = new Date();
        today.setHours(23, 59, 59, 999); // 设置为今天的最后一刻

        // 检查是否选择了未来日期
        if (start > today) {
          this.dateRangeError = '开始时间不能选择未来日期';
          return false;
        }

        if (end > today) {
          this.dateRangeError = '结束时间不能选择未来日期';
          return false;
        }

        if (start > end) {
          this.dateRangeError = '开始时间不能晚于结束时间';
          return false;
        }

        const diffTime = Math.abs(end - start);
        const diffDays = Math.ceil(diffTime / (1000 * 60 * 60 * 24));

        // 根据是否选择往来单位来验证时间段
        if (this.queryForm.institutionName) {
          // 选择了往来单位，时间段可以是1个月内（30天）
          if (diffDays > 30) {
            this.dateRangeError = '选择往来单位时，时间段不能超过1个月';
            return false;
          }
        } else {
          // 没有选择往来单位，时间段只能是7天内
          if (diffDays > 7) {
            this.dateRangeError = '未选择往来单位时，时间段不能超过7天';
            return false;
          }
        }
      }

      return true;
    },

    /** 获取日期范围信息 */
    getDateRangeInfo() {
      if (this.queryForm.startDate && this.queryForm.endDate) {
        const start = new Date(this.queryForm.startDate);
        const end = new Date(this.queryForm.endDate);
        const diffTime = Math.abs(end - start);
        const diffDays = Math.ceil(diffTime / (1000 * 60 * 60 * 24));

        const maxDays = this.queryForm.institutionName ? 30 : 7;
        return `已选择 ${diffDays} 天，${this.queryForm.institutionName ? '选择往来单位' : '未选择往来单位'}时最多可选择 ${maxDays} 天`;
      }
      return '';
    },

    /** 获取时间范围描述 */
    getTimeRangeDescription() {
      const billsTypeText = this.queryForm.billsType === 'A' ? '全部' : (this.queryForm.billsType === 'AI' ? '入库' : '出库');
      return this.queryForm.institutionName
        ? `已选择往来单位，时间段可以选择1个月内的数据。当前单据类型：${billsTypeText}。系统将调用SOAP接口QueryWareHouseBills获取指定时间段、往来单位和单据类型的数据。`
        : `未选择往来单位，时间段只能选择7天内的数据。当前单据类型：${billsTypeText}。建议选择往来单位以获取更大时间范围的数据。`;
    },

    /** 获取导入权限 */
    getImportPermission() {
      if (this.queryForm.importType === 'billsID') {
        return ['wareHouse:billsImport:importByBillsID'];
      } else {
        return ['wareHouse:billsImport:importByDateRange'];
      }
    },

    /** 开始导入 */
    handleImport() {
      this.$refs.queryForm.validate((valid) => {
        if (valid) {
          if (this.queryForm.importType === 'dateRange' && !this.validateDateRange()) {
            return;
          }

          this.loading = true;

          if (this.queryForm.importType === 'billsID') {
            this.importByBillsIDMethod();
          } else {
            this.importByDateRangeMethod();
          }
        }
      });
    },

    /** 单据号导入 */
    importByBillsIDMethod() {
      const data = {
        billsID: this.queryForm.billsID
      };

      importByBillsID(data).then(response => {
        this.loading = false;

        if (response.code === 200) {
          // 检查业务层面的成功状态
          const result = response.data;
          if (result && result.success) {
            this.$modal.msgSuccess("单据导入成功，正在跳转到单据列表...");
            // 延迟1秒后跳转到单据列表
            setTimeout(() => {
              this.$router.push('/wareHouse/list');
            }, 1000);
          } else {
            // 业务失败，显示具体错误信息
            let errorMsg = result.message || "单据导入失败";
            if (errorMsg.includes("未找到")) {
              errorMsg = `单据号 "${this.queryForm.billsID}" 不存在，请检查单据号是否正确`;
            }
            this.$modal.msgWarning(errorMsg);
          }
        } else {
          this.$modal.msgError(response.msg || "导入请求失败，请重试");
        }
      }).catch(error => {
        this.loading = false;

        // 网络错误或其他异常的友好提示
        let errorMessage = "导入遇到问题，请稍后重试";

        if (error.response) {
          if (error.response.status === 500) {
            errorMessage = "服务器内部错误，请联系管理员";
          } else if (error.response.status === 404) {
            errorMessage = "请求的接口不存在，请联系管理员";
          } else if (error.response.status === 403) {
            errorMessage = "没有权限执行此操作";
          } else {
            errorMessage = `请求失败 (${error.response.status})，请重试`;
          }
        } else if (error.request) {
          errorMessage = "网络连接失败，请检查网络后重试";
        } else {
          errorMessage = error.message || "未知错误，请重试";
        }

        this.$modal.msgError(errorMessage);
      });
    },

    /** 时间段查询（显示单据列表供用户选择） */
    importByDateRangeMethod() {
      const data = {
        startDate: this.queryForm.startDate,
        endDate: this.queryForm.endDate,
        institutionName: this.queryForm.institutionName, // 这里传递的是entId
        billsType: this.queryForm.billsType // 添加单据类型参数
      };

      this.billsLoading = true;

      importByDateRange(data).then(response => {
        this.loading = false;
        this.billsLoading = false;

        if (response.code === 200) {
          const result = response.data;

          // 检查业务层面的成功状态
          if (result && result.success !== false) {
            this.billsList = result.billsList || [];
            this.selectedBills = [];

            if (this.billsList.length > 0) {
              this.showBillsDialog = true;
              const currentPageCount = result.currentPageCount || this.billsList.length;
              const totalCount = result.totalCount || this.billsList.length;

              if (totalCount > currentPageCount) {
                this.$modal.msgSuccess(`查询成功，当前页显示 ${currentPageCount} 条单据，总共 ${totalCount} 条，请选择要导入的单据`);
              } else {
                this.$modal.msgSuccess(`查询成功，找到 ${this.billsList.length} 条单据，请选择要导入的单据`);
              }
            } else {
              // 没有数据时显示友好提示
              this.$modal.msg("查询完成，未找到符合条件的单据数据。请检查：1. 时间范围是否正确；2. 往来单位是否存在相关单据；3. 单据是否已经导入过");
            }
          } else {
            // 业务层面失败，显示具体错误信息
            this.$modal.msgWarning(result.message || "查询失败，请重试");
          }
        } else {
          // HTTP层面失败
          this.$modal.msgError(response.msg || "查询请求失败，请检查网络连接");
        }
      }).catch(error => {
        this.loading = false;
        this.billsLoading = false;

        // 网络错误或其他异常的友好提示
        let errorMessage = "查询遇到问题，请稍后重试";

        if (error.response) {
          // 服务器返回了错误状态码
          if (error.response.status === 500) {
            errorMessage = "服务器内部错误，请联系管理员";
          } else if (error.response.status === 404) {
            errorMessage = "请求的接口不存在，请联系管理员";
          } else if (error.response.status === 403) {
            errorMessage = "没有权限执行此操作";
          } else {
            errorMessage = `请求失败 (${error.response.status})，请重试`;
          }
        } else if (error.request) {
          // 网络连接问题
          errorMessage = "网络连接失败，请检查网络后重试";
        } else {
          // 其他错误
          errorMessage = error.message || "未知错误，请重试";
        }

        this.$modal.msgError(errorMessage);
      });
    },

    /** 重置按钮操作 */
    resetQuery() {
      this.queryForm = {
        importType: this.queryForm.importType, // 保持导入方式不变
        billsID: '',
        institutionName: '',
        startDate: '',
        endDate: '',
        billsType: 'AO' // 重置为默认出库
      };
      this.dateRangeError = '';
      this.$refs.queryForm && this.$refs.queryForm.resetFields();
    },

    /** 处理单据选择变化 */
    handleBillsSelectionChange(selection) {
      this.selectedBills = selection;
    },

    /** 批量导入选中的单据 */
    handleImportSelectedBills() {
      if (this.selectedBills.length === 0) {
        this.$modal.msgWarning("请选择要导入的单据");
        return;
      }

      // 构建包含单据号和单据时间的数据
      const billsData = this.selectedBills.map(bill => ({
        billCode: bill.billCode,
        billTime: bill.billTime
      }));

      this.$modal.confirm(`确认要导入选中的 ${billsData.length} 条单据吗？`).then(() => {
        this.importingBills = true;

        const data = {
          billsData: billsData
        };

        importSelectedBills(data).then(response => {
          this.importingBills = false;

          if (response.code === 200) {
            const result = response.data;

            // 检查是否有失败的单据
            if (result.failCount && result.failCount > 0) {
              // 有失败的单据，不跳转页面，显示详细结果
              this.$modal.msgWarning(`${result.message}。失败的单据：${result.failedBills.join(', ')}`);
            } else {
              // 全部成功，跳转到单据列表
              this.$modal.msgSuccess(`${result.message}，正在跳转到单据列表...`);
              this.showBillsDialog = false;

              // 延迟1秒后跳转到单据列表
              setTimeout(() => {
                this.$router.push('/wareHouse/list');
              }, 1000);
            }
          } else {
            this.$modal.msgError(response.msg || "批量导入失败");
          }
        }).catch(error => {
          this.importingBills = false;

          // 网络错误或其他异常的友好提示
          let errorMessage = "批量导入遇到问题，请稍后重试";

          if (error.response) {
            if (error.response.status === 500) {
              errorMessage = "服务器内部错误，请联系管理员";
            } else if (error.response.status === 404) {
              errorMessage = "请求的接口不存在，请联系管理员";
            } else if (error.response.status === 403) {
              errorMessage = "没有权限执行此操作";
            } else {
              errorMessage = `请求失败 (${error.response.status})，请重试`;
            }
          } else if (error.request) {
            errorMessage = "网络连接失败，请检查网络后重试";
          } else {
            errorMessage = error.message || "未知错误，请重试";
          }

          this.$modal.msgError(errorMessage);
        });
      }).catch(() => {
        // 用户取消操作
      });
    },

    /** 关闭单据选择对话框 */
    handleCloseBillsDialog() {
      this.showBillsDialog = false;
      this.billsList = [];
      this.selectedBills = [];
    }
  },
  mounted() {
    // 页面加载时立即加载往来单位数据（默认是时间段导入）
    this.loadInstitutions();
  }
};
</script>

<style scoped>
.box-card {
  margin-bottom: 20px;
}

.clearfix:before,
.clearfix:after {
  display: table;
  content: "";
}

.clearfix:after {
  clear: both;
}

/* 表单样式优化 */
::v-deep .el-form-item {
  margin-bottom: 20px;
}

::v-deep .el-radio-button__inner {
  padding: 12px 20px;
  font-size: 14px;
}

::v-deep .el-card__header {
  padding: 15px 20px;
  border-bottom: 1px solid #ebeef5;
  background-color: #fafafa;
}

::v-deep .el-card__body {
  padding: 20px;
}

::v-deep .el-alert {
  margin-bottom: 15px;
}

::v-deep .el-select .el-input {
  width: 100%;
}
</style>
